using System;

namespace Nice157Advices.Advices
{
    /// <summary>
    /// 60.重新引发异常时使用InnerException
    /// </summary>
    public static class _60
    {
        /**
         * 这是一条很好理解的建议，当捕获了某个异常，将其包装或重新引发异常的时候，如果其中包含了Inner Exception，则有助于程序员分析内部信息，方便代码调试。
         */

        public static void Go ()
        {
            Test1 ();
        }

        private static void Test1 ()
        {
            try
            {
                Test2 ();
            }
            catch (Exception ex)
            {
                // System.Console.WriteLine(ex.InnerException.Message);
                System.Console.WriteLine (ex.Data["argumentNull"].ToString ());
                System.Console.WriteLine ();
                System.Console.WriteLine (ex.ToString ());
            }
        }

        private static void Test2 ()
        {
            try
            {
                throw new ArgumentNullException ("缺少参数");
            }
            catch (ArgumentNullException ex)
            {
                // 通过 Inner Exception (即ex向上传递)
                // throw new ArgumentException("参数异常", ex);
                // 此外还有一个可以采用的技巧，如果不打算使用Inner Exception，但是仍然想要返回一些额外信息的话，可以使用Exception的Data属性
                ex.Data.Add ("argumentNull", "参数异常");
                throw ex;
            }
        }
    }
}